package cn.butcher.config;

import cn.butcher.mapper.UserMapper;
import cn.butcher.vo.User;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.HashSet;
import java.util.Set;

public class UserRealm extends AuthorizingRealm {
    @Autowired
    UserMapper mapper;


    // 授权，如果认证通过，就对我们的用户进行授权，用户才能有权限去操作其他资源
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {

        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        // 从shiro中获取我们的用户信息
        User user = (User) principalCollection.getPrimaryPrincipal();

        // ******注意：不该去每次都去数据库中查的，这样很耗费资源，因为每一次请求都会走这里******

        if (user.getRole() == null) {
            user.setRole(mapper.getRolesById(user.getId()));
        }

        if (user.getPerms() == null) {
            user.setPerms(mapper.getPermsById(user.getId()));
        }

        // 此时我们给登录的用户授权,就可以了
        // 那权限我们需要从数据库读取

        // 我们现在并没有赋任何权限，试一下，都可以点，因为我们点击切换菜单的时候似乎没做请求，做了
        // 设置权限
        info.setStringPermissions(user.getPerms());
        info.addRoles(user.getRole());
        return info;
    }

    // 认证，认证完了再授权，认证就是验证我们的用户名密码正不正确
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
        // 前端传过来的用户名
        String username = token.getUsername();
        User user = mapper.getUserById(Integer.parseInt(username));
        if (user != null) {
            return new SimpleAuthenticationInfo(user, user.getPassword(), getName());
        } else {
            return null;
        }
        // shiro不需要我们去验证密码，验证密码给shiro帮我们做，shiro觉得它认证比较安全
        // shiro可能会用到一些加密，然后去验证我们的密码，猜的
    }
}
